"""
处理步骤：
第一步： 反序列化操作： 转化为字典
第二步： 取到期望结果键值对： key 是jsonpath 表示式，value是断言的预期结果
    - 判断： key是$ 开头的json提取器，对login.json()去jsonpath提取
    - 或者是text，login.text 执行结果 vs value
第三步： key用来从login的结果里提取数据的 -- 执行结果
第四步： value vs 执行结果数据 断言比对

封装函数步骤：一次封装，多次使用
1、功能代码写出来
2、def 封装
3、参数化：考虑数据是变化的 设置为参数
4、判断是否返回值：不需要设置返回值

函数优化：
1、加日志
2、异常捕获：断言成功或失败的结果，记录日志 / 断言失败，异常抛出
3、因为有些用例的步骤可能不需要做断言，这个预期结果字段空的 -- None 判空处理
"""
import json
from jsonpath import jsonpath
from loguru import logger
def handle_assert(actual_res,expect):
    """
    这是做响应断言的函数
    :param actual_res:响应结果
    :param expect:从excel表格里读取的预期结果表达式
    :return:
    """
    logger.info("-------------开始做断言------------------")
    # 这是判断处理 -- 不需要断言
    if expect is None:
        logger.info("这条用例不需要做断言")
        return
    expect = json.loads(expect)
    logger.info(f"预期结果是{expect}")
    for k, v in expect.items():
        if k.startswith("$"):
            actual = jsonpath(actual_res.json(), k)[0]
            logger.info(f"实际结果是{actual}")
            try:
                assert actual == v
                logger.info("断言通过！")
            except Exception as f:
                logger.error("断言失败")
                raise f
        elif k == "text":
            actual = actual_res.text
            logger.info(f"实际结果是{actual}")
            try:
                assert actual == v
                logger.info("断言通过！")
            except Exception as f:
                logger.error("断言失败！")
                raise f

